const router = require('express').Router();// 分发请求
const { v4: uuidv4 } = require('uuid');// 生成id (随机字符串)
const userModel = require('../../model/userModel');// 执行sql语句的模块
const aes = require('../../common/aes');//加密的工具
const emailApi = require('../../common/email/emailApi');//处理邮箱验证的工具
const Jwt = require('../../common/token/jwt');//处理token的工具 json web token

// 注册
// 3）加密密码（保护用户数据） 有邮箱验证 (辩别用户的真实性)
// URL: /api/user/register
// 参数：user_acc , user_pwd, email_code
router.post('/register', async (req, res) => {
    // email: user_acc
    // 获取前端提交的参数
    let { user_acc, user_pwd, email_code } = req.body;
    // 为了减少报错 做一层判断
    if (user_acc == undefined || user_acc == '' || user_pwd == undefined || user_pwd == '') {
        res.send({
            code: -1,
            msg: '缺少参数，请重新填写。'
        })
        return;
    }
    // 邮箱验证 (参数1：邮箱  参数2：验证码)
    await emailApi.verifyEmailCode(user_acc, email_code)
        .then(
            async (data) => {
                // console.log("1.0",data)
                // 验证通过
                if (data.code == 200) {
                    // 注册账号
                    // 生成用户id
                    let user_id = uuidv4();
                    // 用户注册的时间
                    let dt = new Date();
                    let user_create_time = dt.toLocaleDateString() + " " + dt.toLocaleTimeString(); // 2023/11/06 15:01:00
                    // 加密密码
                    user_pwd = aes.aesEncrypt(user_pwd);
                    // 调用函数进行注册
                    await userModel.register(user_id, user_acc, user_pwd, user_create_time)
                        .then(
                            (data) => {
                                // 注册成功
                                res.send(data)
                            },
                            (err) => {
                                // 注册失败
                                res.send(err)
                            }
                        )

                    // 删除验证码
                    emailApi.removeEmailCode(user_acc);

                } else {
                    // 反馈验证失败的信息
                    res.send(data)
                }
            },
            (err) => {
                // 验证失败
                res.send({
                    code: -1,
                    msg: '邮箱验证失败。',
                    err
                })
            }
        )
})

// 登录
// URL: /api/user/login
// 参数：user_acc , user_pwd
router.post('/login', async (req, res) => {
    // 接收前端的参数
    let { user_acc, user_pwd } = req.body;
    // 为了减少报错 做一层判断
    if (user_acc == undefined || user_acc == '' || user_pwd == undefined || user_pwd == '') {
        res.send({
            code: -1,
            msg: '缺少参数，请重新填写。'
        })
        return;
    }
    // 调用登录的api
    await userModel.login(user_acc, user_pwd).then(
        (data) => {
            // user_pwd: 用户提交的密码
            // data[0].user_pwd： 数据库的随机字符串
            console.log('2.0',data);
            // console.log('3.0',aes.aesDecrypt(user_pwd, data[0].user_pwd));//返回的结果是布尔值， true 表示匹配正确，false匹配错误
            // 处理登录 参数1：用户提交的密码 ， 参数2： 数据库的加密密码
            if (data[0]) {
                if (aes.aesDecrypt(user_pwd, data[0].user_pwd)) {

                    // 生成token (临时身份) 
                    let user_id = data[0].user_id;
                    let jsonwebtoken = new Jwt(user_id);
                    // 追踪用户的登录状态
                    let token = jsonwebtoken.getToken();

                    // 登录成功
                    res.send({
                        code: 200,
                        msg: '登录成功。',
                        user_acc,
                        user_name: data[0].user_name,
                        token
                    })
                }
                else {
                    // 账号或密码错误
                    res.send({
                        code: -1,
                        msg: '账号或密码错误。'
                    })
                }
            }
            else {
                res.send({
                    code: 404,
                    msg: '该账号不存在。2222'
                })
            }
        },
        (err) => {
            // 执行失败
        }
    )
})

// 判断用户是否为登录中状态
// URL: /api/user/isLogin
// 参数： token
router.post('/isLogin', async (req, res) => {
    // 获取token
    let token = req.body.token || req.headers.token;
    // 验证token
    let result = new Jwt(token).verifyToken();
    console.log('4.0', result);
    if (result.code == 200) {
        res.send({
            code: 200,
            msg: '在线状态。'
        })
    }
    else {
        res.send({
            code: -1,
            msg: '登录失效,请重新登录。'
        })
    }

})

// 找回密码
// URL: /api/user/findpwd
// 参数：user_acc, email_code
// 通过邮箱验证，可以设置新密码
// req: request  请求对象
// res: response 响应对象
router.post('/findpwd', async (req, res) => {
    // 获取账号（邮箱） ， 验证码，新密码
    let { user_acc, email_code, new_user_pwd } = req.body;

    // 为了减少报错 做一层判断
    if (user_acc == undefined || user_acc == '' || email_code == undefined || email_code == '' || new_user_pwd == undefined || new_user_pwd == '') {
        res.send({
            code: -1,
            msg: '缺少参数，请重新填写。'
        })
        return;
    }

    // 邮箱验证 (参数1：邮箱  参数2：验证码)
    await emailApi.verifyEmailCode(user_acc, email_code)
        .then(
            async (data) => {
                if (data.code == 200) {
                    // 修改新密码，加密密码
                    new_user_pwd = aes.aesEncrypt(new_user_pwd);
                    // 验证通过 (传递账号，新密码)
                    await userModel.findpwd(user_acc, new_user_pwd)
                        .then(
                            content => {
                                // 执行修改密码
                                // console.log("5.0",content);
                                res.send({
                                    code: 200,
                                    msg: '修改密码成功。',
                                    content
                                })
                            },
                            error => {
                                // 执行修改密码失败
                                res.send({
                                    code: -1,
                                    msg: '修改密码失败。',
                                    error
                                })
                            }
                        )
                    // 删除验证码
                    emailApi.removeEmailCode(user_acc);

                }
                else {
                    // 验证失败(数据库没有这个验证码)
                    res.send(data);
                }
            },
            (err) => {
                // 验证失败（数据库服务异常）
                res.send(err);
            }
        )



})


// 获取用户信息
// URL: /api/user/info
// 参数：token
router.post('/info', async (req, res) => {
    let token = req.body.token || req.headers.token;
    let result = new Jwt(token).verifyToken()
    if (result.code == 200) {
        // 登录状态
        // console.log('y.1',result)
        // console.log('y.2',user_id)
        let user_id = result.info.data;//用户id
        // 获取用户信息
        await userModel.info(user_id).then(
            (content) => {
                // 响应数据给前端
                res.send(content)
            },
            (err) => {
                res.send(err)
            }
        )
    }
    else {
        // 不是登录状态
        res.send({
            code: -1,
            msg: '您还没有登录哦。'
        })
    }
})

// 获取用户信息
// URL: /api/user/user_info
// 参数：token
router.post('/user_info', async (req, res) => {
    let user_id = req.body.user_id;//用户id
    // 获取用户信息
    await userModel.user_info(user_id).then(
        (content) => {
            // 响应数据给前端
            res.send(content)
        },
        (err) => {
            res.send(err)
        }
    )
})

// 注销账号(删除账号)
// URL: /api/user/remove
// 参数：token, user_acc
router.post('/remove', async (req, res) => {
    let token = req.body.token || req.headers.token;
    let user_acc = req.body.user_acc;
    let result = new Jwt(token).verifyToken()
    if (result.code == 200) {
        // 登录状态
        let user_id = result.info.data;//用户id
        // 获取用户信息
        await userModel.remove(user_acc, user_id).then(
            (content) => {
                // 响应数据给前端
                res.send(content)
            },
            (err) => {
                res.send(err)
            }
        )
    }
    else {
        // 不是登录状态
        res.send({
            code: -1,
            msg: '您还没有登录哦。'
        })
    }
})

// 修改用户资料
// URL: /api/user/modify
// user_sex,user_age, user_address, user_tel,user_name
router.post('/modify', async (req, res) => {
    let token = req.body.token || req.headers.token;
    let result = new Jwt(token).verifyToken()
    if (result.code == 200) {
        let { user_sex, user_age, user_address, user_tel, user_name } = req.body;
        if (user_sex && user_age && user_address) {
            // 登录状态
            let user_id = result.info.data;//用户id
            // 修改用户信息
            await userModel.modify(user_id, user_sex, user_age, user_address, user_tel, user_name).then(
                (content) => {
                    // 响应数据给前端
                    res.send(content)
                },
                (err) => {
                    res.send(err)
                }
            )
        }
        else {
            res.send({
                code: -1,
                msg: '缺少参数。'
            })
        }

    }
    else {
        // 不是登录状态
        res.send({
            code: -1,
            msg: '您还没有登录哦。'
        })
    }
})

// 设置用户头像
// URL: /api/user/modify_user_src
// user_id, user_src
router.post('/modify_user_src', async (req, res) => {
    let token = req.body.token || req.headers.token;
    let result = new Jwt(token).verifyToken()
    if (result.code == 200) {
        let { user_src } = req.body;
        if (user_src) {
            // 登录状态
            let user_id = result.info.data;//用户id
            // 修改用户信息
            await userModel.modify_user_src(user_id, user_src).then(
                (content) => {
                    // 响应数据给前端
                    res.send(content)
                },
                (err) => {
                    res.send(err)
                }
            )
        }
        else {
            res.send({
                code: -1,
                msg: '缺少参数。'
            })
        }

    }
    else {
        // 不是登录状态
        res.send({
            code: -1,
            msg: '您还没有登录哦。'
        })
    }
})

// 根据所有用户
router.get('/total', async (req, res) => {
    // 获取用户信息
    await userModel.total().then(
        (content) => {
            // 响应数据给前端
            res.send(content)
        },
        (err) => {
            res.send(err)
        }
    )
})

// 根据所有用户
router.get('/total_user_sex', async (req, res) => {
    let { user_sex } = req.query;
    if (user_sex) {
        // 获取用户信息
        await userModel.total_user_sex(user_sex).then(
            (content) => {
                // 响应数据给前端
                res.send(content)
            },
            (err) => {
                res.send(err)
            }
        )
    }
    else {
        res.send({
            code: -1,
            msg: '缺少参数。'
        })
    }

})

// 修改用户资料
// user_name
router.post('/modify', async (req, res) => {
    let token = req.body.token || req.headers.token;
    let result = new Jwt(token).verifyToken()
    if (result.code == 200) {
        let { user_name } = req.body;
        if (user_sex && user_age && user_address) {
            // 登录状态
            let user_id = result.info.data;//用户id
            // 修改用户信息
            await userModel.modify(user_id, user_name).then(
                (content) => {
                    // 响应数据给前端
                    res.send(content)
                },
                (err) => {
                    res.send(err)
                }
            )
        }
        else {
            res.send({
                code: -1,
                msg: '缺少参数。'
            })
        }

    }
    else {
        // 不是登录状态
        res.send({
            code: -1,
            msg: '您还没有登录哦。'
        })
    }
})


module.exports = router;